Day30 - Externalized Configuration
前言
Spring Boot提供外部化配置,它可以讓同樣的程式碼但在不一樣的環境中運行,也就是說當你透過IDE將你的程式碼打包成jar後,把jar放到測試環境或是正式環境它會依你放在jar旁邊的properties檔(或yaml檔)、環境變數或command-line給的參數不同來運行,程式可以透過@Value來取得設定檔的值,可以透過@ConfigurationProperties將所有設定值綁定到Java物件中。今天我們就來研究一下運行的機制吧
專案建立
PropertySource order
Spring Boot提供多樣化的設定屬性的方式,以下是優先及順序由低到高,一旦遇到衝突,後項蓋掉前項設定值
-
Default properties (specified by setting SpringApplication.setDefaultProperties)
- @PropertySource指定加載的配置(需要寫在@Configuration類上才可生效)
-
Config data(application.properties/yml等)
- RandomValuePropertySource支持的random.*配置(如:@Value("${random.int}"))
- OS environment variables
- Java System properties (System.getProperties())
- JNDI attributes from java:comp/env
- ServletContext init parameters
- ServletConfig init parameters
- Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property)
-
Command line arguments
- 測試屬性。(@SpringBootTest進行測試時指定的屬性)
- @DynamicPropertySource annotations in your tests
- 測試類@TestPropertySource註解
- Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active
Config data files order
若properties與yml同時存在會以properties優先
- jar 包內的application.properties/yml
- jar 包內的application-{profile}.properties/yml
- jar 包外的application.properties/yml
- jar 包外的application-{profile}.properties/yml
小結
- 命令行 > 包外config直接子目錄 > 包外config目錄 > 包外根目錄 > 包內目錄
- 同級比較:
- profile配置 > 默認配置
- properties配置 > yml配置
Importing Additional Data
當參數檔需要分拆檔案時,可以透過spring.config.import將其匯入,當需要調用參數檔時可在properties檔中使用${xxx:default value}
test.properties
app.greeting = Hello Day30_externalized_config
application.properties
spring.config.import=test.properties
app.sayhello= ${app.ccccc:hello james}
HelloController
@RestController
public class HelloController {
@Value("${app.greeting}")
private String greeting;
@Value("${app.sayhello}")
private String sayHello;
@GetMapping("/hello")
public String hello(){
System.out.println("greeting:"+greeting);
System.out.println("sayHello:"+sayHello);
return greeting;
}
}
result
Reference